#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

struct msgbuf
{
    long mtype;
    int i;
    char ch;
};


int main(int argc,char const* argv[])
{
    key_t key=ftok("./app",'a');
    if (-1==key)
    {
        perror("ftok err\n");
        return -1;
    }
    printf("%#x\n",key);

    int msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666);
    if(-1==msgid)
    {
        if(EEXIST==errno)
        {
            msgid=msgget(key,0666);
        }
        else
        {
            perror("msgget err\n");
            return -1;
        }
    }
    printf("msgid:%d\n",msgid);
    struct msqid_ds ds;

    struct msgbuf msg;
    msg.mtype=10;
    msg.i=0;
    msg.ch='a';

    int size=sizeof(struct msgbuf)-sizeof(long);
    msgsnd(msgid,&msg,size,0);

    msgctl(msgid,IPC_STAT,&ds);
    printf("num:%ld\n",ds.msg_qnum);

    msg.mtype=20;
    msg.i=1;
    msg.ch='b';
    msgsnd(msgid,&msg,size,0);


    msgctl(msgid,IPC_STAT,&ds);
    printf("num:%ld\n",ds.msg_qnum);

    struct msgbuf m;
    msgrcv(msgid,&m,size,20,0);
    printf("%d:%c\n",m.i,m.ch);

    msgctl(msgid,IPC_RMID,NULL);

    return 0;
}